package bizzard.client;
import bizzard.shared.*;

import java.util.*;
import com.google.gwt.core.client.*;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.*;


/*
 * AJOUTER LES .jar DE xstream ET DE kxml QUI SE TROUVENT DANS war/WEB-INFO/lib AUX LIBRAIRIES DU build path
 */
//+----------------------------------------------------------------------+
//| Bizzard
//|
//| bizzardService	: 	webservice utilisé pour les appels AJAX
//| viewimg			: 	composite utilisé pour afficher la liste de troll sous forme image
//| viewlist		: 	composite utilisé pour afficher la liste de troll sous forme texte
//| viewtroll 		:   composite utilisé pour créer/éditer/supprimer un troll
//| directory		: 	repertoire dans lequel se situe les trolls .xml
//| trolls  		:   hashmap indexé sur le nom du troll
//| races  			:   hashmap indexé sur le nom de la race
//|
//| - classe principale
//| - effectue les appels webservice
//|
//| --- pour plus de lisibilité cette classe ne sert que de transition aux autres classes
//+----------------------------------------------------------------------+

public class Bizzard implements EntryPoint {
	
	private static Bizzard SINGLETON;
	private final BizzardServiceAsync bizzardService = GWT.create(BizzardService.class);
	private ViewImg viewimg = new ViewImg();
	private ViewList viewlist = new ViewList();
	private ViewTroll viewtroll = new ViewTroll();
	
	private String directory = "./trolls";
	private HashMap<String, Troll> trolls = null;
	private HashMap<String, Race> races = null;
	
	public void onModuleLoad() {	
		SINGLETON = this;
		setRaces();
		getTrolls();
			
		//partie graphique
		DockPanel dock = new DockPanel();
		dock.setWidth("100%");
		dock.setStyleName("main");
		dock.setHorizontalAlignment(DockPanel.ALIGN_CENTER);
		
		dock.add(viewimg, DockPanel.NORTH);
		dock.add(viewlist, DockPanel.WEST);
		dock.add(viewtroll, DockPanel.EAST);
		
		RootPanel.get().add(dock);
	}
	 public static Bizzard get() {
	    	return SINGLETON;
	    }
	/*******************************************************************************
	 * appel asynchrone pour enregistrer un troll sous forme xml
	 * 
	 * @param troll	~ le troll à sauvegarder
	 ******************************************************************************/
	public void saveTroll(Troll troll) {
		AsyncCallback<Troll> bizzardService2Callback = new AsyncCallback<Troll>() {
			public void onSuccess(Troll result) {
				if(result!=null) {
					trolls.put(result.getName(), result);
					updateTrolls();
				}
			}
			public void onFailure(Throwable ex) {
				RootPanel.get().add(new HTML("erreur : " + ex.toString()));
			}
		};
		bizzardService.saveTroll(directory, troll, bizzardService2Callback);
	}
	/*******************************************************************************
	 * appel asynchrone pour supprimer un troll xml
	 * 
	 * @param name	~ le nom du fichier à supprimer (present dans directory)
	 * @param maj	~ si l'on supprime definitivement ce troll ou non
	 ******************************************************************************/
	public void deleteTroll(final Troll troll, final String maj) {
		final String name = troll.getName();
		final String trollImg = troll.getImg();
		
		/* on supprime le fichier du troll dans tous les cas
		 */
		AsyncCallback<Boolean> bizzardService3Callback = new AsyncCallback<Boolean>() {
			public void onSuccess(Boolean result) {
				trolls.remove(name);
				
				//on supprime definitivement le troll = on met à jour les listes de troll
				if(maj.contentEquals("delete")) { updateTrolls(); }
			}
			public void onFailure(Throwable ex) {
				RootPanel.get().add(new HTML("erreur : " + ex.toString()));
			}
		};		
		bizzardService.deleteFile(directory + "/" + troll.getName() + ".xml", bizzardService3Callback);
		
		/* on supprime l'ancienne image
		 *	-- si on renomme le troll
		 *	-- si on supprime definitivement le troll 
		 */
		if(maj.contentEquals("rename") || maj.contentEquals("delete")) {
			AsyncCallback<Boolean> bizzardService4Callback = new AsyncCallback<Boolean>() {
				public void onSuccess(Boolean result) { }
				public void onFailure(Throwable ex) { RootPanel.get().add(new HTML("erreur : " + ex.toString())); }
			};
			bizzardService.deleteFile(trollImg, bizzardService4Callback);
		}
	}
	/*******************************************************************************
	 * initialise le hashmap de race
	 ******************************************************************************/
	private void setRaces() {
		races = new HashMap<String, Race>();
		
		Race race = new Race("Skrim");
		race.addCaractere(new Attribut("Botte secrete"));
		race.addCaractere(new Attribut("Hypnotisme"));
		races.put(race.getName(), race);
		
		race = new Race("Kastar");
		race.addCaractere(new Attribut("Acceleration Metabolique"));
		race.addCaractere(new Attribut("Connaissance des Monstres"));
		races.put(race.getName(), race);
		
		race = new Race("Durakuir");
		race.addCaractere(new Attribut("Regeneration Accrue"));
		race.addCaractere(new Attribut("Rafale Psychique"));
		races.put(race.getName(), race);
		
		race = new Race("Tomawak");
		race.addCaractere(new Attribut("Camouflage"));
		race.addCaractere(new Attribut("Projectile magique"));
		races.put(race.getName(), race);
		
		race = new Race("Darkling");
		race.addCaractere(new Attribut("Balayage"));
		race.addCaractere(new Attribut("Siphon des Ames"));
		races.put(race.getName(), race);
	}
	/*******************************************************************************
	 * initialise le hashmap de troll (async)
	 ******************************************************************************/
	private void getTrolls() {
		
		//methode async = renvoit la liste des trolls indexé sur le nom de la race
		
		@SuppressWarnings("rawtypes")
		AsyncCallback<HashMap<String, HashMap>> bizzardServiceCallback = new AsyncCallback<HashMap<String, HashMap>>() {
			@SuppressWarnings("unchecked")
			public void onSuccess(HashMap<String, HashMap> result) {
			    for (String item : result.keySet()) {
			    	if(item.contentEquals("races"))
			    		races = result.get(item);
			    	else if(item.contentEquals("trolls"))
			    		trolls = result.get(item);
				}
			    
			    //on met à jour les vues
					if(races!=null) {
						viewlist.setRaces(races);
						viewtroll.setRaces(races);
					}
					updateTrolls();
			}
			public void onFailure(Throwable ex) {
				trolls = null;
				RootPanel.get().add(new HTML("erreur : " + ex.toString()));
			}
		};
		bizzardService.getTrolls(races, directory, bizzardServiceCallback);
	}
	
	/*******************************************************************************
	 * renommer l'image du troll (appel async)
	 * 
	 * @param path ~ le chemin de l'image
	 * @param name ~ le nouveau nom
	 ******************************************************************************/
	public void renameImg(String path, String name) {

		AsyncCallback<String> bizzardServiceCallback = new AsyncCallback<String>() {
			public void onSuccess(String result) {
			}
			public void onFailure(Throwable ex) {
				RootPanel.get().add(new HTML("erreur : " + ex.toString()));
			}
		};
		bizzardService.renameImg(path, name, bizzardServiceCallback);
	}
	
	/*******************************************************************************
	 * met à jour les listes de troll dans les vues
	 * 
	 ******************************************************************************/
	public void updateTrolls() {
		if(trolls!=null) {
			viewlist.setTrolls(trolls);
			viewimg.setTrolls(trolls);
		}
		viewlist.updateList();
		viewimg.updateList();
	}
}
